﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOCiudades
    /// </summary>
    class DAOIMPLCiudades:Presupuesto_DAO.DAOCiudades
    {
        /// <summary>
        /// Guarda una ciudad
        /// </summary>
        /// <param name="idProvincia">Indice de la provincia a la que pertenece la ciudad</param>
        /// <param name="nombre">Nombre de la ciudad</param>
        /// <param name="codPostal">Código postal de la ciudad</param>
        /// <param name="activo">Determina si está activa en la base de datos</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveCiudad(int idProvincia, string nombre, string codPostal, bool activo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO ciudades(id_provincia, Nombre, CodPostal, Activo) VALUES(@idProvincia, @nombre, @codPostal, @activo)";
                insertar.Parameters.AddWithValue("@idProvincia", idProvincia);
                insertar.Parameters.AddWithValue("@nombre", nombre);
                insertar.Parameters.AddWithValue("@codPostal", codPostal);
                insertar.Parameters.AddWithValue("@activo", activo);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica una ciudad
        /// </summary>
        /// <param name="idProvincia">Indice de la provincia a la que pertenece la ciudad</param>
        /// <param name="nombre">Nombre de la ciudad</param>
        /// <param name="codPostal">Código postal de la ciudad</param>
        /// <param name="activo">Determina si está activa en la base de datos</param>
        /// <param name="idCiudad">Determina la ciudad a modificar</param>
        /// <returns>Devuelve true si fue modificada correctamente o false si falló</returns>
        public bool updateCiudad(int idProvincia, string nombre, string codPostal, bool activo, int idCiudad)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE ciudades SET id_provincia = @idProvincia, Nombre = @nombre, CodPostal = @codPostal, Activo = @activo WHERE id_ciudad = @idCiudad";
                modificar.Parameters.AddWithValue("@idProvincia", idProvincia);
                modificar.Parameters.AddWithValue("@nombre", nombre);
                modificar.Parameters.AddWithValue("@codPostal", codPostal);
                modificar.Parameters.AddWithValue("@activo", activo);
                modificar.Parameters.AddWithValue("@idCiudad", idCiudad);
                modificar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina una ciudad
        /// </summary>
        /// <param name="nombre">Determina la ciudad a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteCiudad(string nombre)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE ciudades SET Activo = @activo WHERE Nombre = @nombre";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@nombre", nombre);
                eliminar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista las ciudades
        /// </summary>
        /// <returns>Devuelve una tabla con las ciudades</returns>
        public DataTable getAllCiudad()
        {
            DataTable ciudades = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
               
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT c.id, c.Nombre, pro.Nombre, pa.Nombre, c.Activo FROM ciudades c " 
                                    + "INNER JOIN provincias pro ON c.id_provincia = pro.id "
                                    + "INNER JOIN paises pa ON pro.id_pais = pa.id";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(ciudades);
                
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();
                
            }
            catch (Exception ex)
            {
                ciudades = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return ciudades;
        }

        /// <summary>
        /// Obtiene una ciudad
        /// </summary>
        /// <param name="nombre">Determina la ciudad a obtener</param>
        /// <returns>Devuelve un objeto ciudad</returns>
        public ciudades getCiudad(string nombre)
        {
            ciudades ciudad = new ciudades();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {
                
                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM ciudades WHERE Nombre = @nombre";
                listado.Parameters.AddWithValue("@nombre", nombre);
                MySqlDataReader lector = listado.ExecuteReader();
                while (lector.Read())
                {
                    ciudad.ID = Convert.ToInt16(lector["id"].ToString());
                    ciudad.ID_Provincia = Convert.ToInt16(lector["id_provincia"].ToString());
                    ciudad.Nombre = lector["Nombre"].ToString();
                    ciudad.Codigo_Postal = lector["CodPostal"].ToString();
                    ciudad.Activo = Convert.ToBoolean(lector["Activo"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                ciudad = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return ciudad;
        }
    }
}
